package adapter

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/mars/internal/admin/core/application/client"
	"github.com/mars/internal/admin/core/application/service"
	"github.com/mars/internal/admin/core/domain"
	"github.com/mars/pkg/errors"
)

type CartController struct {
	srv       service.Service
	validator *domain.CartValidator
}

func NewCartController(fc domain.Factory) *CartController {
	return &CartController{
		srv:       service.NewService(fc),
		validator: domain.NewCartValidator(),
	}
}

// GetCartList 获取购物车列表
// @Summary 获取购物车列表
// @Description 分页查询购物车信息，管理员可查看所有用户的购物车项目，支持按用户、商品、状态筛选和关键字搜索
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param size query int false "每页数量" default(20)
// @Param openid query string false "用户openid"
// @Param productId query string false "商品ID"
// @Param status query string false "购物车状态" Enums(active,inactive,expired)
// @Param keyword query string false "关键字搜索（用户openid）"
// @Param sort query string false "排序字段" default(createTime)
// @Param order query string false "排序方向" Enums(asc,desc) default(desc)
// @Success 200 {object} map[string]interface{} "{"data": [购物车列表], "total": 总数}"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/list [get]
func (cc *CartController) GetCartList(cxt *gin.Context) (interface{}, int64, error) {
	// 使用domain层验证器验证查询参数
	params, err := cc.validator.ValidateQueryParams(cxt)
	if err != nil {
		return nil, 0, err
	}

	cartItems, total, err := cc.srv.CartSrv().GetCartList(cxt, params)
	if err != nil {
		return nil, 0, err
	}

	// 转换为view层结构体
	cartItemViews := client.ToCartItemViewList(cartItems)
	return cartItemViews, total, nil
}

// GetCartItem 根据ID获取购物车项详情
// @Summary 获取购物车项详情
// @Description 根据购物车项ID查询详细信息，包括关联的商品信息
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Param id path string true "购物车项ID"
// @Success 200 {object} client.CartItemView "购物车项详细信息"
// @Failure 400 {object} map[string]interface{} "购物车ID参数错误"
// @Failure 404 {object} map[string]interface{} "购物车项不存在"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/detail/{id} [get]
func (cc *CartController) GetCartItem(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证购物车ID
	cartID, err := cc.validator.ValidateCartID(cxt, "id")
	if err != nil {
		return nil, err
	}

	cartItem, err := cc.srv.CartSrv().GetCartItem(cxt, cartID)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	cartItemView := client.ToCartItemView(cartItem)
	return cartItemView, nil
}

// GetUserCartItems 获取指定用户的购物车列表
// @Summary 获取用户购物车列表
// @Description 根据用户openid查询该用户的所有有效购物车项目
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Param openid path string true "用户openid"
// @Success 200 {array} client.CartItemView "用户购物车列表"
// @Failure 400 {object} map[string]interface{} "openid参数错误"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/user/{openid} [get]
func (cc *CartController) GetUserCartItems(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证openid
	openid, err := cc.validator.ValidateOpenID(cxt, "openid")
	if err != nil {
		return nil, err
	}

	cartItems, err := cc.srv.CartSrv().GetUserCartItems(cxt, openid)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	cartItemViews := client.ToCartItemViewList(cartItems)
	return cartItemViews, nil
}

// GetCartItemsByProduct 根据商品ID获取购物车项列表
// @Summary 根据商品查询购物车项
// @Description 根据商品ID查询所有包含该商品的购物车项目
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Param productId path string true "商品ID"
// @Success 200 {array} client.CartItemView "购物车列表"
// @Failure 400 {object} map[string]interface{} "商品ID参数错误"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/product/{productId} [get]
func (cc *CartController) GetCartItemsByProduct(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证商品ID
	productID, err := cc.validator.ValidateProductID(cxt, "productId")
	if err != nil {
		return nil, err
	}

	cartItems, err := cc.srv.CartSrv().GetCartItemsByProduct(cxt, productID)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	cartItemViews := client.ToCartItemViewList(cartItems)
	return cartItemViews, nil
}

// GetCartItemsByStatus 根据状态获取购物车项列表
// @Summary 根据状态查询购物车项
// @Description 根据购物车状态（active/inactive/expired）查询购物车项列表
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Param status path string true "购物车状态" Enums(active,inactive,expired)
// @Success 200 {array} client.CartItemView "购物车列表"
// @Failure 400 {object} map[string]interface{} "状态参数错误或无效"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/status/{status} [get]
func (cc *CartController) GetCartItemsByStatus(cxt *gin.Context) (interface{}, error) {
	// 使用domain层验证器验证购物车状态
	status, err := cc.validator.ValidateCartStatus(cxt, "status")
	if err != nil {
		return nil, err
	}

	// 如果状态为空，返回错误
	if status == "" {
		return nil, errors.New(http.StatusBadRequest, "status parameter is required")
	}

	cartItems, err := cc.srv.CartSrv().GetCartItemsByStatus(cxt, status)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	cartItemViews := client.ToCartItemViewList(cartItems)
	return cartItemViews, nil
}

// GetCartStats 获取购物车统计信息
// @Summary 获取购物车统计信息
// @Description 获取购物车的多维度统计信息，包括总数、状态分布、热门商品等
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Success 200 {object} client.CartStatsView "购物车统计信息"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/stats [get]
func (cc *CartController) GetCartStats(cxt *gin.Context) (interface{}, error) {
	stats, err := cc.srv.CartSrv().GetCartStats(cxt)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	statsView := client.ToCartStatsView(stats)
	return statsView, nil
}

// SearchCartItems 搜索购物车项
// @Summary 搜索购物车项
// @Description 根据关键字搜索购物车项目，支持按用户openid搜索
// @Tags 购物车管理
// @Accept json
// @Produce json
// @Param keyword query string true "搜索关键字"
// @Success 200 {array} client.CartItemView "购物车列表"
// @Failure 400 {object} map[string]interface{} "请求参数错误"
// @Failure 500 {object} map[string]interface{} "服务器内部错误"
// @Router /api/v1/admin/cart/search [get]
func (cc *CartController) SearchCartItems(cxt *gin.Context) (interface{}, error) {
	keyword := cxt.Query("keyword")
	if keyword == "" {
		return nil, errors.New(http.StatusBadRequest, "keyword parameter is required")
	}

	// 使用domain层验证器验证关键字
	if _, err := cc.validator.ValidateQueryParams(cxt); err != nil {
		return nil, err
	}

	cartItems, err := cc.srv.CartSrv().SearchCartItems(cxt, keyword)
	if err != nil {
		return nil, err
	}

	// 转换为view层结构体
	cartItemViews := client.ToCartItemViewList(cartItems)
	return cartItemViews, nil
}
